package com.example.myapplication.ui.home

import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.Service
import android.content.Intent
import android.graphics.PixelFormat
import android.os.Build
import android.os.IBinder
import android.util.Log
import android.view.Gravity
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.WindowManager
import android.widget.Button
import androidx.core.app.NotificationCompat
import com.example.myapplication.R

class HomeService : Service() {

    /**
     * 悬浮框ID
     */
    private val floatBallID = "float_box"

    /**
     * 窗口管理器
     */
    private lateinit var windowManager: WindowManager

    /**
     * 悬浮框对象
     */
    private lateinit var floatingView: View

    // 初始触摸坐标
    private var initialTouchX = 0f;
    private var initialTouchY = 0f;

    // 悬浮框的初始坐标
    private var initialX = 0;
    private var initialY = 0;

    /**
     * 当前任务是否正在进行
     */
    private var taskStatus = false;

    // 必须实现的抽象方法（用于绑定服务时返回 IBinder）
    override fun onBind(intent: Intent?): IBinder? {
        TODO("Not yet implemented")
    }

    /**
     * 首次创建服务时调用
     */
    override fun onCreate() {
        super.onCreate()

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            createNotificationChannel()

            val notification = buildNotification()
            // 启动服务后，必须在5秒内设置前台服务通知信息
            startForeground(1001, notification)
        }

        // 创建悬浮框
        createFloatingWindow()

        Log.d("MyService", "Service 已创建")
    }

    /**
     * 创建通知渠道
     */
    private fun createNotificationChannel() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            // 创建通知渠道
            val channel = NotificationChannel(
                floatBallID,
                "悬浮框",
                NotificationManager.IMPORTANCE_LOW
            )
            // 注册通知渠道
            getSystemService(NotificationManager::class.java).createNotificationChannel(channel)
        }
    }

    /**
     * 发送通知
     */
    private fun buildNotification(): Notification {
        return NotificationCompat.Builder(this, floatBallID)
            .setContentTitle("自动翻页中") // 设置通知标题
            .setContentText("显示前台悬浮框") // 设置标题内容
            .setSmallIcon(R.drawable.ic_home_black_24dp) // 设置通知小图标
            .setPriority(NotificationCompat.PRIORITY_LOW) // 设置通知优先级
            .build() // 构建并返回通知
    }

    /**
     * 开始任务
     */
    private fun startTask() {
        if (taskStatus) return

        taskStatus = true

        // 自定义广播 Action (需要与接收端一致)
        val intent = Intent("com.example.action.CUSTOM_TIMED_TASK_SWIPE").apply {
            // 自定义参数
            putExtra("customType", "start")
            // 限制接收广播的包名
            setPackage(packageName)
        }

        // 发送广播
        sendBroadcast(intent)
    }

    /**
     * 结束任务
     */
    private fun endTask(){
        if (!taskStatus) return

        taskStatus = false

        // 自定义广播 Action (需要与接收端一致)
        val intent = Intent("com.example.action.CUSTOM_TIMED_TASK_SWIPE").apply {
            // 添加参数
            putExtra("customType", "end")
            // 限制接收广播的包名
            setPackage(packageName)
        }

        // 发送广播
        sendBroadcast(intent)
    }

    /**
     * 创建悬浮框
     */
    private fun createFloatingWindow() {
        // 获取 WindowManager 实例
        windowManager = getSystemService(WINDOW_SERVICE) as WindowManager
        // 设置布局类型
        val layoutFlag: Int = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
        } else {
            WindowManager.LayoutParams.TYPE_PHONE
        }

        // 设置布局参数
        val params = WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT, // 宽度自适应
            WindowManager.LayoutParams.WRAP_CONTENT, // 高度自适应
            layoutFlag, // 布局类型
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, // 不准获取焦点
            PixelFormat.TRANSLUCENT // 半透明
        ).apply {
            // 设置对齐方向
            gravity = Gravity.TOP or Gravity.START
            x = 0
            y = 0
        }

        // 获取 LayoutInflater 实例
        val inflater = getSystemService(LAYOUT_INFLATER_SERVICE) as LayoutInflater
        // 加载悬浮框布局
        floatingView = inflater.inflate(R.layout.float_ball, null)
        // 添加悬浮框拖动事件
        floatingView.setOnTouchListener { view, event ->
            when (event.action) {
                // 按下事件
                MotionEvent.ACTION_DOWN -> {
                    // 记录初始X坐标
                    initialX = params.x;
                    // 记录初始Y坐标
                    initialY = params.y;
                    // 记录初始触摸X坐标
                    initialTouchX = event.rawX;
                    // 记录初始触摸Y坐标
                    initialTouchY = event.rawY;
                    true
                }
                // 移动事件
                MotionEvent.ACTION_MOVE -> {
                    // 更新X坐标位置
                    params.x = initialX + (event.rawX - initialTouchX).toInt()
                    // 更新Y轴坐标位置
                    params.y = initialY + (event.rawY - initialTouchY).toInt()
                    // 更新悬浮框位置
                    windowManager.updateViewLayout(floatingView, params)
                    true
                }

                MotionEvent.ACTION_UP -> {
                    view.performClick() // 触发点击事件
                    true
                }

                else -> false
            }
        }

        // 开始任务(发送广播)
        floatingView.findViewById<Button>(R.id.start_task).setOnClickListener {
            Log.d("FloatBall", "开始执行任务")

            startTask()
        }

        // 结束任务（发送广播）
        floatingView.findViewById<Button>(R.id.end_task).setOnClickListener {
            Log.d("FloatBall", "结束任务")

            endTask()
        }


        // 添加悬浮框到窗口
        windowManager.addView(floatingView, params)
    }

    // 每次启动时调用
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {

        // 判断是否有权限
//        if(isAccessibilityServiceEnabled()){
//            println("即将开始开始执行滑动")
//            setTimeout(5000){
//                println("开始执行滑动")
//                accessibilityService.startAuto()
//            }
//        }else{
//            println("未启用无障碍模式")
//        }

        Log.d("MyService", "Service 已启动")
        return super.onStartCommand(intent, flags, startId)
    }

    // 服务销毁时调用
    override fun onDestroy() {
        // 非空判断
        if (::floatingView.isInitialized) {
            windowManager.removeView(floatingView)
        }
        Log.d("MyService", "Service 已销毁")
        super.onDestroy()
    }
}